package mysql

import (
	"bluebell/models"
	"crypto/md5"
	"encoding/hex"
	"errors"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

// encryptPassword 对密码进行加密
const secret = "xxx.vip"
func encryptPassword(data []byte) (result string) {
	h := md5.New()
	h.Write([]byte(secret))
	return hex.EncodeToString(h.Sum(data))
}

// CheckUserExist 检查指定用户名的用户是否存在
// 用户不存在 ---> ErrorUserNotExit
// 用户存在 ---> ErrorUserExit
// 数据库错误 ---> tx.Error
func CheckUserExist(username string) (error error){
	user := models.User{}
	tx := db.Where("username = ?",username).Take(user)
	if tx.Error != nil{
		if tx.Error == gorm.ErrRecordNotFound{
			// 没有查询到数据 ---》用户不存在
			return errors.New(ErrorUserNotExit)
		}
		// 查询失败
		return tx.Error
	}
	// 查询成功 ---》 用户存在
	return errors.New(ErrorUserExit)
}

// InsertUser 注册业务-向数据库中插入一条新的用户
// 获取id失败 ---> ErrorInsertFailed
// 成功 ---> nil
func InsertUser(user models.User) (error error){
	// 对密码进行加密
	user.Password = encryptPassword([]byte(user.Password))
	// 执行SQL语句入库
	tx := db.Create(&user)
	if tx.Error != nil{
		return errors.New(ErrorInsertFailed)
	}
	return nil
}

// Login 登录业务
// 用户不存在 ---> ErrorUserNotExit
// 数据库错误 ---> tx.Error
// 密码错误 ---> ErrorPasswordWrong
// 成功 ---> nil
func Login(user *models.User) (err error){
	// 记录一下原始密码(用户登录的密码)
	originPassword := user.Password
	tx := db.Where("username = ?",user.UserName).Take(&user)
	if tx.Error != nil{
		// 用户不存在
		if tx.Error == gorm.ErrRecordNotFound{
			return errors.New(ErrorUserNotExit)
		}
		// 查询失败
		return tx.Error
	}
	// 生成加密密码与查询到的密码比较
	password := encryptPassword([]byte(originPassword))
	if user.Password != password{
		return errors.New(ErrorPasswordWrong)
	}
	return nil
}

// GetUserById 根据AuthorId查询作者信息
// 数据库错误或者没有查到数据 ---> nil,tx.Error
// 成功：user,nil
func GetUserById(userId uint64) (user *models.User, err error) {
	user = &models.User{}
	tx := db.Where("user_id = ?",userId).Take(&user)
	if tx.Error != nil{
		if tx.Error == gorm.ErrRecordNotFound{
			err = errors.New(ErrorInvalidID)
			zap.L().Error("dao mysql user GetUserById() failed",zap.Uint64("AuthorId",userId),zap.Error(err))
		}else{
			zap.L().Error("dao mysql user  GetUserById() failed",zap.Error(tx.Error))
		}
		return nil,err
	}
	return
}